--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / repository_server_manager.py
Displaying Raw • Download
meshchatx/src/backend/repository_server_manager.py 25d7b960432b59f0ed8e8b361a7e5711b74ee154 (25d7b960) Text, 23.02 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Wheel and file repository under identity storage (uploads + refreshed PyPI wheels)."""
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787html
Tff7b72import T7ee787httpT7ee787.T7ee787server
Tff7b72import T7ee787json
Tff7b72import T7ee787logging
Tff7b72import T7ee787os
Tff7b72import T7ee787re
Tff7b72import T7ee787shutil
Tff7b72import T7ee787socketserver
Tff7b72import T7ee787threading
Tff7b72import T7ee787urllibT7ee787.T7ee787error
Tff7b72import T7ee787urllibT7ee787.T7ee787parse
Tff7b72import T7ee787urllibT7ee787.T7ee787request
Tff7b72from T7ee787collectionsT7ee787.T7ee787abc Tff7b72import Te6edf3Callable
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any
Te6edf3_PYPI_USER_AGENT Tff7b72= Ta5d6ff"Ta5d6ffMeshChatXRepositoryBundler/1 (+https://github.com/)Ta5d6ff"
Te6edf3_MESHCHATX_BUNDLE_PIP_NAME Tff7b72= Ta5d6ff"Ta5d6ffreticulum-meshchatxTa5d6ff"
Te6edf3_DEFAULT_PACKAGES Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffrnsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrnspureTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmfTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrnshTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnomadnetTa5d6ff"Tb4b4b4,
Te6edf3_MESHCHATX_BUNDLE_PIP_NAMETb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ff_parse_extra_packagesTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tff7b72.Tff7b72.Tff7b72.Tb4b4b4]Tb4b4b4:
Te6edf3raw Tff7b72= Tb4b4b4(Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_REPOSITORY_EXTRA_PIPTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3rawTb4b4b4:
Tff7b72return Tb4b4b4(Tb4b4b4)
Te6edf3parts Tff7b72= Tb4b4b4[Te6edf3pTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3p Tff7b72in Te6edf3rawTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff;Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3pTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4]
Tff7b72return Tffa657tupleTb4b4b4(Tffa657dictTff7b72.Td2a8fffromkeysTb4b4b4(Te6edf3partsTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffbundled_pip_targetsTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tff7b72.Tff7b72.Tff7b72.Tb4b4b4]Tb4b4b4:
Tff7b72return Tffa657tupleTb4b4b4(Tffa657dictTff7b72.Td2a8fffromkeysTb4b4b4(Te6edf3_DEFAULT_PACKAGES Tff7b72+ Te6edf3_parse_extra_packagesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffmeshchat_bundle_project_rootTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3Path Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Directory containing ``pyproject.toml`` for this MeshChatX tree (repo layout helper)."""
Te6edf3here Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3anc Tff7b72in Te6edf3hereTff7b72.Td2a8ffparentsTb4b4b4:
Te6edf3meta Tff7b72= Te6edf3anc Tff7b72/ Ta5d6ff"Ta5d6ffpyproject.tomlTa5d6ff"
Tff7b72if Tff7b72not Te6edf3metaTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3head Tff7b72= Te6edf3metaTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff4000Tb4b4b4]
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72continue
Tff7b72if Ta5d6ff"Ta5d6ffreticulum-meshchatxTa5d6ff" Tff7b72not Tff7b72in Te6edf3headTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72if Tb4b4b4(Te6edf3anc Tff7b72/ Ta5d6ff"Ta5d6ffmeshchatxTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffis_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3anc
Tff7b72return Tff7b72None
Te6edf3REPOSITORY_BUNDLED_PUBLIC_PARTS Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffrepository-server-bundledTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbundledTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffpublic_bundled_wheels_dirTb4b4b4(Te6edf3public_dirTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Directory under ``public_dir`` where build-staged wheels live (HTTP + optional pip fallback)."""
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3public_dirTb4b4b4, Tff7b72*Te6edf3REPOSITORY_BUNDLED_PUBLIC_PARTSTb4b4b4)
Tff7b72def Td2a8ff_pip_spec_stemTb4b4b4(Te6edf3specTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3s Tff7b72= Te6edf3specTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff[Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3op Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff===Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff==Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff>=Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff<=Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff!=Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff~=Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff>Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff<Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3op Tff7b72in Te6edf3sTb4b4b4:
Te6edf3s Tff7b72= Te6edf3sTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3opTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72break
Tff7b72return Te6edf3sTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3specTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_pypi_project_jsonTb4b4b4(Te6edf3canonical_nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3safe Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffquoteTb4b4b4(Te6edf3canonical_nameTb4b4b4)
Te6edf3url Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffhttps://pypi.org/pypi/Tffd700{Te6edf3safeTffd700}Ta5d6ff/jsonTa5d6ff"
Te6edf3req Tff7b72= Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffRequestTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3headersTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffUser-AgentTa5d6ff"Tb4b4b4: Te6edf3_PYPI_USER_AGENTTb4b4b4}Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffurlopenTb4b4b4(Te6edf3reqTb4b4b4, Te6edf3timeoutTff7b72=T79c0ff90Tb4b4b4) Tff7b72as Te6edf3respTb4b4b4:
Tff7b72return Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3respTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72except Te6edf3urllibTff7b72.Td2a8fferrorTff7b72.Td2a8ffHTTPError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Te6edf3eTff7b72.Td2a8ffcode Tff7b72== T79c0ff404Tb4b4b4:
Tff7b72return Tff7b72None
Te6edf3body Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3body Tff7b72= Te6edf3eTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff500Tb4b4b4]
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
Te6edf3loggingTff7b72.Td2a8ffwarningTb4b4b4(Ta5d6ff"Ta5d6ffPyPI HTTP error for Tffd700%sTa5d6ff: Tffd700%sTa5d6ff Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3canonical_nameTb4b4b4, Te6edf3eTff7b72.Td2a8ffcodeTb4b4b4, Te6edf3bodyTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3loggingTff7b72.Td2a8ffexceptionTb4b4b4(Ta5d6ff"Ta5d6ffPyPI JSON fetch failed for Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3canonical_nameTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_pypi_pick_wheel_entryTb4b4b4(Te6edf3urlsTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3wheels Tff7b72= Tb4b4b4[
Te6edf3u
Tff7b72for Te6edf3u Tff7b72in Te6edf3urls
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3uTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72and Te6edf3uTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpackagetypeTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffbdist_wheelTa5d6ff"
Tff7b72and Te6edf3uTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffurlTa5d6ff"Tb4b4b4)
Tff7b72and Te6edf3uTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4)
Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3wheelsTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffsort_keyTb4b4b4(Te6edf3uTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657intTb4b4b4, Tffa657intTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Te6edf3fn Tff7b72= Tffa657strTb4b4b4(Te6edf3uTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3fnTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ffpy3-none-any.whlTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3fnTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ffpy2.py3-none-any.whlTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3tier Tff7b72= T79c0ff0
Tff7b72elif Ta5d6ff"Ta5d6ff-none-any.whlTa5d6ff" Tff7b72in Te6edf3fnTb4b4b4:
Te6edf3tier Tff7b72= T79c0ff1
Tff7b72elif Ta5d6ff"Ta5d6ffnone-anyTa5d6ff" Tff7b72in Te6edf3fnTb4b4b4:
Te6edf3tier Tff7b72= T79c0ff2
Tff7b72elif Ta5d6ff"Ta5d6ffany.whlTa5d6ff" Tff7b72in Te6edf3fnTb4b4b4:
Te6edf3tier Tff7b72= T79c0ff3
Tff7b72elseTb4b4b4:
Te6edf3tier Tff7b72= T79c0ff10
Te6edf3size Tff7b72= Tffa657intTb4b4b4(Te6edf3uTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4) Tff7b72or T79c0ff0Tb4b4b4)
Tff7b72return Tb4b4b4(Te6edf3tierTb4b4b4, Tff7b72-Te6edf3sizeTb4b4b4, Te6edf3fnTb4b4b4)
Te6edf3wheelsTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Te6edf3sort_keyTb4b4b4)
Tff7b72return Te6edf3wheelsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72def Td2a8ff_download_http_to_fileTb4b4b4(Te6edf3urlTb4b4b4: Tffa657strTb4b4b4, Te6edf3dest_pathTb4b4b4: Te6edf3PathTb4b4b4, Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff900.0Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3req Tff7b72= Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffRequestTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3headersTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffUser-AgentTa5d6ff"Tb4b4b4: Te6edf3_PYPI_USER_AGENTTb4b4b4}Tb4b4b4)
Te6edf3dest_pathTff7b72.Td2a8ffparentTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3part Tff7b72= Te6edf3dest_pathTff7b72.Td2a8ffwith_nameTb4b4b4(Te6edf3dest_pathTff7b72.Td2a8ffname Tff7b72+ Ta5d6ff"Ta5d6ff.partTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3urllibTff7b72.Td2a8ffrequestTff7b72.Td2a8ffurlopenTb4b4b4(Te6edf3reqTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4) Tff7b72as Te6edf3respTb4b4b4:
Te6edf3data Tff7b72= Te6edf3respTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3partTff7b72.Td2a8ffwrite_bytesTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3partTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3dest_pathTb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72if Te6edf3partTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3partTff7b72.Td2a8ffunlinkTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72pass
Tff7b72def Td2a8ff_download_wheel_via_pypi_indexTb4b4b4(
Te6edf3package_specTb4b4b4: Tffa657strTb4b4b4,
Te6edf3destTb4b4b4: Te6edf3PathTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3timeoutTb4b4b4: Tffa657float Tff7b72= T79c0ff900.0Tb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657boolTb4b4b4, Tffa657str Tff7b72| Tff7b72NoneTb4b4b4]Tb4b4b4:
Te6edf3name Tff7b72= Te6edf3_pip_spec_stemTb4b4b4(Te6edf3package_specTb4b4b4)
Te6edf3data Tff7b72= Te6edf3_pypi_project_jsonTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72if Te6edf3data Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffpypi_not_foundTa5d6ff"
Te6edf3urls Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffurlsTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3urlsTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffpypi_no_urlsTa5d6ff"
Te6edf3entry Tff7b72= Te6edf3_pypi_pick_wheel_entryTb4b4b4(Te6edf3urlsTb4b4b4)
Tff7b72if Tff7b72not Te6edf3entryTb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffpypi_no_wheel_fileTa5d6ff"
Te6edf3url Tff7b72= Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffurlTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3fn Tff7b72= Tffa657strTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3url Tff7b72or Tff7b72not Te6edf3fnTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.whlTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffpypi_bad_wheel_entryTa5d6ff"
Te6edf3target Tff7b72= Te6edf3dest Tff7b72/ Te6edf3fn
Tff7b72tryTb4b4b4:
Te6edf3_download_http_to_fileTb4b4b4(Te6edf3urlTb4b4b4, Te6edf3targetTb4b4b4, Te6edf3timeoutTff7b72=Te6edf3timeoutTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff2000Tb4b4b4]
Tff7b72return Tff7b72TrueTb4b4b4, Tff7b72None
Tff7b72def Td2a8ffdownload_bundled_wheels_to_directoryTb4b4b4(
Te6edf3destTb4b4b4: Te6edf3PathTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3on_packageTb4b4b4: Te6edf3CallableTb4b4b4[Tb4b4b4[Tffa657intTb4b4b4, Tffa657intTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4, Tff7b72NoneTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Populate ``dest`` with wheels for :func:`bundled_pip_targets`.
Uses PyPI project metadata JSON and HTTPS downloads via ``urllib`` only.
"""
Te6edf3destTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3packages Tff7b72= Tffa657listTb4b4b4(Te6edf3bundled_pip_targetsTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3total Tff7b72= Tffa657lenTb4b4b4(Te6edf3packagesTb4b4b4)
Te6edf3okTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3failedTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3iTb4b4b4, Te6edf3pkg Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3packagesTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3on_package Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3on_packageTb4b4b4(Te6edf3iTb4b4b4, Te6edf3totalTb4b4b4, Te6edf3pkgTb4b4b4)
Te6edf3g_httpTb4b4b4, Te6edf3e_http Tff7b72= Te6edf3_download_wheel_via_pypi_indexTb4b4b4(Te6edf3pkgTb4b4b4, Te6edf3destTb4b4b4)
Tff7b72if Te6edf3g_httpTb4b4b4:
Te6edf3okTff7b72.Td2a8ffappendTb4b4b4(Te6edf3pkgTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3failedTb4b4b4[Te6edf3pkgTb4b4b4] Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffpypi:Tffd700{Te6edf3e_http Tff7b72or Ta5d6ff'Ta5d6fffailedTa5d6ff'Tffd700}Ta5d6ff"
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3okTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdownloadedTa5d6ff"Tb4b4b4: Te6edf3okTb4b4b4,
Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4: Te6edf3failedTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ff_normalize_listen_hostTb4b4b4(Te6edf3hostTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3h Tff7b72= Tb4b4b4(Te6edf3host Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3h Tff7b72or Tffa657lenTb4b4b4(Te6edf3hTb4b4b4) Tff7b72> T79c0ff200 Tff7b72or Tffa657anyTb4b4b4(Te6edf3c Tff7b72in Te6edf3h Tff7b72for Te6edf3c Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\rTa5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\tTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3h
Te6edf3_REPOSITORY_INDEX_HTML Tff7b72= Ta5d6ff"Ta5d6ffrepository-server-index.htmlTa5d6ff"
Te6edf3_FILE_LIST_MARKER Tff7b72= Ta5d6ff"Ta5d6ff<!--FILE_LISTS-->Ta5d6ff"
Tff7b72def Td2a8ff_repository_index_template_pathTb4b4b4(Te6edf3public_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Te6edf3Path Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Resolve the repository index HTML (Vite public / built ``public`` / source tree)."""
Tff7b72if Te6edf3public_dirTb4b4b4:
Te6edf3candidate Tff7b72= Te6edf3PathTb4b4b4(Te6edf3public_dirTb4b4b4) Tff7b72/ Te6edf3_REPOSITORY_INDEX_HTML
Tff7b72if Te6edf3candidateTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3candidate
Te6edf3here Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparent
Te6edf3src_public Tff7b72= Te6edf3hereTff7b72.Td2a8ffparent Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffpublicTa5d6ff" Tff7b72/ Te6edf3_REPOSITORY_INDEX_HTML
Tff7b72if Te6edf3src_publicTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3src_public
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_format_index_sizeTb4b4b4(Te6edf3nTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Te6edf3n Tff7b72< T79c0ff1024Tb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3nTffd700}Ta5d6ff BTa5d6ff"
Tff7b72if Te6edf3n Tff7b72< T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3n Tff7b72/ T79c0ff1024Tffd700:Ta5d6ff.1fTffd700}Ta5d6ff KBTa5d6ff"
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3n Tff7b72/ Tb4b4b4(T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4)Tffd700:Ta5d6ff.1fTffd700}Ta5d6ff MBTa5d6ff"
Tff7b72def Td2a8ff_list_index_filesTb4b4b4(Te6edf3subdirTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3rowsTb4b4b4: Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3subdirTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3rows
Tff7b72for Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3subdirTb4b4b4)Tb4b4b4, Te6edf3keyTff7b72=Tffa657strTff7b72.Td2a8fflowerTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3subdirTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3size Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetsizeTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72continue
Te6edf3rowsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3nameTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3rows
Tff7b72def Td2a8ff_index_file_sectionTb4b4b4(
Te6edf3titleTb4b4b4: Tffa657strTb4b4b4, Te6edf3url_prefixTb4b4b4: Tffa657strTb4b4b4, Te6edf3file_rowsTb4b4b4: Tffa657listTb4b4b4[Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4]
Tb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3linesTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Ta5d6fffTa5d6ff'Ta5d6ff<h2 class=Ta5d6ff"Ta5d6ffsectionTa5d6ff"Ta5d6ff>Tffd700{Te6edf3htmlTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3titleTb4b4b4)Tffd700}Ta5d6ff</h2>Ta5d6ff'Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3file_rowsTb4b4b4:
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff<p class=Ta5d6ff"Ta5d6ffemptyTa5d6ff"Ta5d6ff>Nothing here yet.</p>Ta5d6ff'Tb4b4b4)
Tff7b72return Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff<table class=Ta5d6ff"Ta5d6fffilesTa5d6ff"Ta5d6ff>Ta5d6ff'Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff<thead><tr><th>Name</th><th class=Ta5d6ff"Ta5d6ffsizeTa5d6ff"Ta5d6ff>Size</th></tr></thead>Ta5d6ff'Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff<tbody>Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3size Tff7b72in Te6edf3file_rowsTb4b4b4:
Te6edf3q Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffquoteTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3safeTff7b72=Ta5d6ff"Ta5d6ff@Ta5d6ff%Ta5d6ff+.-_Ta5d6ff"Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(
Ta5d6ff"Ta5d6ff<tr><td>Ta5d6ff"
Ta5d6fffTa5d6ff'Ta5d6ff<a href=Ta5d6ff"Tffd700{Te6edf3htmlTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3url_prefix Tff7b72+ Te6edf3qTb4b4b4, Te6edf3quoteTff7b72=Tff7b72TrueTb4b4b4)Tffd700}Ta5d6ff"Ta5d6ff>Tffd700{Te6edf3htmlTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3nameTb4b4b4)Tffd700}Ta5d6ff</a>Ta5d6ff'
Ta5d6fffTa5d6ff'Ta5d6ff</td><td class=Ta5d6ff"Ta5d6ffsizeTa5d6ff"Ta5d6ff>Tffd700{Te6edf3htmlTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3_format_index_sizeTb4b4b4(Te6edf3sizeTb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff</td></tr>Ta5d6ff'
Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff</tbody></table>Ta5d6ff"Tb4b4b4)
Tff7b72return Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)
Tff7b72def Td2a8ffbuild_repository_index_htmlTb4b4b4(
Te6edf3bundled_dirTb4b4b4: Tffa657strTb4b4b4,
Te6edf3uploads_dirTb4b4b4: Tffa657strTb4b4b4,
Te6edf3public_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""HTML shell with live bundled and uploads file tables (for ``/`` and ``/index.html``)."""
Te6edf3template Tff7b72= Te6edf3_repository_index_template_pathTb4b4b4(Te6edf3public_dirTb4b4b4)
Te6edf3shellTb4b4b4: Tffa657str
Tff7b72if Te6edf3template Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3shell Tff7b72= Te6edf3templateTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Te6edf3loggingTff7b72.Td2a8ffexceptionTb4b4b4(Ta5d6ff"Ta5d6ffrepository index template read failed: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3templateTb4b4b4)
Te6edf3shell Tff7b72= Tb4b4b4(
Ta5d6ff'Ta5d6ff<!DOCTYPE html><html lang=Ta5d6ff"Ta5d6ffenTa5d6ff"Ta5d6ff><head><meta charset=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Ta5d6ff>Ta5d6ff'
Ta5d6ff"Ta5d6ff<title>MeshChatX repository</title></head><body><!--FILE_LISTS--></body></html>Ta5d6ff"
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3loggingTff7b72.Td2a8ffwarningTb4b4b4(
Ta5d6ff"Ta5d6ffrepository index template not found (expected under public_dir or src/frontend/public)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3shell Tff7b72= Tb4b4b4(
Ta5d6ff'Ta5d6ff<!DOCTYPE html><html lang=Ta5d6ff"Ta5d6ffenTa5d6ff"Ta5d6ff><head><meta charset=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Ta5d6ff>Ta5d6ff'
Ta5d6ff"Ta5d6ff<title>MeshChatX repository</title></head><body><!--FILE_LISTS--></body></html>Ta5d6ff"
Tb4b4b4)
Te6edf3bundled_rows Tff7b72= Te6edf3_list_index_filesTb4b4b4(Te6edf3bundled_dirTb4b4b4)
Te6edf3upload_rows Tff7b72= Te6edf3_list_index_filesTb4b4b4(Te6edf3uploads_dirTb4b4b4)
Te6edf3injected Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(
Tb4b4b4(
Te6edf3_index_file_sectionTb4b4b4(Ta5d6ff"Ta5d6ffBundledTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbundled/Ta5d6ff"Tb4b4b4, Te6edf3bundled_rowsTb4b4b4)Tb4b4b4,
Te6edf3_index_file_sectionTb4b4b4(Ta5d6ff"Ta5d6ffUploadsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffuploads/Ta5d6ff"Tb4b4b4, Te6edf3upload_rowsTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72if Te6edf3_FILE_LIST_MARKER Tff7b72in Te6edf3shellTb4b4b4:
Tff7b72return Te6edf3shellTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3_FILE_LIST_MARKERTb4b4b4, Te6edf3injectedTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72return Te6edf3shell Tff7b72+ Te6edf3injected
Tff7b72def Td2a8ffmake_repository_http_request_handlerTb4b4b4(
Te6edf3rootTb4b4b4: Tffa657strTb4b4b4,
Te6edf3public_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657typeTb4b4b4[Te6edf3httpTff7b72.Td2a8ffserverTff7b72.Td2a8ffSimpleHTTPRequestHandlerTb4b4b4]Tb4b4b4:
T8b949e"""``SimpleHTTPRequestHandler`` subclass: dynamic index listing at ``/`` and ``/index.html``."""
Te6edf3root_abs Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3rootTb4b4b4)
Te6edf3uploads_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3root_absTb4b4b4, Ta5d6ff"Ta5d6ffuploadsTa5d6ff"Tb4b4b4)
Te6edf3bundled_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3root_absTb4b4b4, Ta5d6ff"Ta5d6ffbundledTa5d6ff"Tb4b4b4)
Te6edf3template_public Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3public_dirTb4b4b4) Tff7b72if Te6edf3public_dir Tff7b72else Tff7b72None
Tff7b72class T56d364RepositoryHTTPRequestHandlerTb4b4b4(Te6edf3httpTff7b72.Td2a8ffserverTff7b72.Td2a8ffSimpleHTTPRequestHandlerTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Te6edf3directoryTff7b72=Te6edf3root_absTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72def Td2a8ff_index_request_pathTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffurlparseTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpathTb4b4b4)
Te6edf3norm Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffunquoteTb4b4b4(Te6edf3parsedTff7b72.Td2a8ffpathTb4b4b4)
Tff7b72if Te6edf3norm Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72return Te6edf3normTff7b72.Td2a8ffrstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff/index.htmlTa5d6ff"
Tff7b72def Td2a8ff_send_indexTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3include_bodyTb4b4b4: Tffa657boolTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3body Tff7b72= Te6edf3build_repository_index_htmlTb4b4b4(
Te6edf3bundled_dirTb4b4b4,
Te6edf3uploads_dirTb4b4b4,
Te6edf3public_dirTff7b72=Te6edf3template_publicTb4b4b4,
Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_responseTb4b4b4(T79c0ff200Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-TypeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftext/html; charset=utf-8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsend_headerTb4b4b4(Ta5d6ff"Ta5d6ffContent-LengthTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3bodyTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffend_headersTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3include_bodyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwfileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3bodyTb4b4b4)
Tff7b72def Td2a8ffdo_GETTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_index_request_pathTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_indexTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72return
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdo_GETTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdo_HEADTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_index_request_pathTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_indexTb4b4b4(Tff7b72FalseTb4b4b4)
Tff7b72return
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdo_HEADTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3RepositoryHTTPRequestHandler
Tff7b72def Td2a8ff_safe_any_upload_filenameTb4b4b4(Te6edf3nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3base Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3base Tff7b72or Te6edf3base Tff7b72!= Te6edf3name Tff7b72or Ta5d6ff"Ta5d6ff..Ta5d6ff" Tff7b72in Te6edf3baseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Tff7b72not Te6edf3reTff7b72.Td2a8fffullmatchTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6ff[A-Za-z0-9._+Ta5d6ff\Ta5d6ff-]+Ta5d6ff"Tb4b4b4, Te6edf3baseTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3base
Tff7b72class T56d364RepositoryServerManagerTb4b4b4:
T8b949e"""Keeps user uploads and a ``bundled`` directory of wheels (PyPI over HTTPS, stdlib only)."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3storage_pathTb4b4b4: Tffa657strTb4b4b4, Te6edf3public_dirTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroot Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3storage_pathTb4b4b4, Ta5d6ff"Ta5d6ffrepository-serverTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffuploads_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrootTb4b4b4, Ta5d6ff"Ta5d6ffuploadsTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbundled_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrootTb4b4b4, Ta5d6ff"Ta5d6ffbundledTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_public_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3public_dirTb4b4b4) Tff7b72if Te6edf3public_dir Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_last_refresh_errorTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_last_refresh_okTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_last_refresh_failedTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_http_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_httpdTb4b4b4: Te6edf3socketserverTff7b72.Td2a8ffThreadingTCPServer Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_threadTb4b4b4: Te6edf3threadingTff7b72.Td2a8ffThread Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_listen_hostTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_listen_portTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_last_hostTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_last_portTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_refresh_progressTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffcompletedTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fftotalTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Tb4b4b4}
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuploads_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbundled_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_seed_bundled_from_publicTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_buildtime_bundled_sourceTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_public_dir Tff7b72or Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_public_dirTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3public_bundled_wheels_dirTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_public_dirTb4b4b4)
Tff7b72def Td2a8ff_seed_bundled_from_publicTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Copy build-staged wheels into identity storage when missing (offline installs)."""
Te6edf3src_root Tff7b72= Tff7b72selfTff7b72.Td2a8ff_buildtime_bundled_sourceTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3src_root Tff7b72or Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3src_rootTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3names Tff7b72= Tb4b4b4[
Te6edf3n
Tff7b72for Te6edf3n Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3src_rootTb4b4b4)
Tff7b72if Te6edf3nTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.whlTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3src_rootTb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4)
Tb4b4b4]
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72return
Tff7b72if Tff7b72not Te6edf3namesTb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3existing Tff7b72= Tb4b4b4{
Te6edf3n
Tff7b72for Te6edf3n Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbundled_dirTb4b4b4)
Tff7b72if Te6edf3nTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6ff.whlTa5d6ff"Tb4b4b4)
Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbundled_dirTb4b4b4, Te6edf3nTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72except Tf85149OSErrorTb4b4b4:
Te6edf3existing Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Te6edf3namesTb4b4b4:
Tff7b72if Te6edf3name Tff7b72in Te6edf3existingTb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffcopy2Tb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3src_rootTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4, Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbundled_dirTb4b4b4, Te6edf3nameTb4b4b4)
Tb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3loggingTff7b72.Td2a8ffwarningTb4b4b4(
Ta5d6ff"Ta5d6ffrepository bundled seed copy failed for Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3nameTb4b4b4, Te6edf3e
Tb4b4b4)
Tff7b72def Td2a8ff_http_status_blockTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3running Tff7b72= Tff7b72selfTff7b72.Td2a8ff_httpd Tff7b72is Tff7b72not Tff7b72None
Te6edf3url Tff7b72= Tff7b72None
Tff7b72if Tb4b4b4(
Te6edf3running
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_http_listen_host Tff7b72is Tff7b72not Tff7b72None
Tff7b72and Tff7b72selfTff7b72.Td2a8ff_http_listen_port Tff7b72is Tff7b72not Tff7b72None
Tb4b4b4)Tb4b4b4:
Te6edf3url Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffhttp://Tffd700{Tff7b72selfTff7b72.Td2a8ff_http_listen_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8ff_http_listen_portTffd700}Ta5d6ff/Ta5d6ff"
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Te6edf3runningTb4b4b4,
Ta5d6ff"Ta5d6ffhostTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_listen_hostTb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_listen_portTb4b4b4,
Ta5d6ff"Ta5d6ffurlTa5d6ff"Tb4b4b4: Te6edf3urlTb4b4b4,
Ta5d6ff"Ta5d6fflast_hostTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_last_hostTb4b4b4,
Ta5d6ff"Ta5d6fflast_portTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_last_portTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffstatusTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffrootTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrootTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffuploads_dirTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuploads_dirTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbundled_dirTa5d6ff"Tb4b4b4: Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbundled_dirTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbundled_targetsTa5d6ff"Tb4b4b4: Tffa657listTb4b4b4(Te6edf3bundled_pip_targetsTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fflast_refresh_errorTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_last_refresh_errorTb4b4b4,
Ta5d6ff"Ta5d6fflast_refresh_okTa5d6ff"Tb4b4b4: Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_last_refresh_okTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fflast_refresh_failedTa5d6ff"Tb4b4b4: Tffa657dictTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_last_refresh_failedTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffrefresh_progressTa5d6ff"Tb4b4b4: Tffa657dictTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_refresh_progressTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbuildtime_bundled_wheels_dirTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_buildtime_bundled_sourceTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffhttpTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_status_blockTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffstart_http_serverTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3hostTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3portTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Serve ``repository-server`` root over plain HTTP (no TLS) on a background thread."""
Te6edf3bind_host Tff7b72= Te6edf3_normalize_listen_hostTb4b4b4(Te6edf3host Tff7b72or Tff7b72selfTff7b72.Td2a8ff_http_last_host Tff7b72or Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3bind_hostTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid_hostTa5d6ff"Tb4b4b4}
Te6edf3bind_port Tff7b72= Tb4b4b4(
Tffa657intTb4b4b4(Te6edf3portTb4b4b4)
Tff7b72if Te6edf3port Tff7b72is Tff7b72not Tff7b72None
Tff7b72else Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_http_last_port Tff7b72if Tff7b72selfTff7b72.Td2a8ff_http_last_port Tff7b72is Tff7b72not Tff7b72None Tff7b72else T79c0ff8787Tb4b4b4)
Tb4b4b4)
Tff7b72if Te6edf3bind_port Tff7b72< T79c0ff0 Tff7b72or Te6edf3bind_port Tff7b72> T79c0ff65535Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffinvalid_portTa5d6ff"Tb4b4b4}
Te6edf3handler Tff7b72= Te6edf3make_repository_http_request_handlerTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffrootTb4b4b4, Te6edf3public_dirTff7b72=Tff7b72selfTff7b72.Td2a8ff_public_dir
Tb4b4b4)
Tff7b72class T56d364_RepoHTTPServerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffThreadingTCPServerTb4b4b4)Tb4b4b4:
Te6edf3allow_reuse_address Tff7b72= Tff7b72True
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_http_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_httpd Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffalready_runningTa5d6ff"Tb4b4b4}
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_httpd Tff7b72= Te6edf3_RepoHTTPServerTb4b4b4(Tb4b4b4(Te6edf3bind_hostTb4b4b4, Te6edf3bind_portTb4b4b4)Tb4b4b4, Te6edf3handlerTb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_httpd Tff7b72= Tff7b72None
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbind_failedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4}
Te6edf3addr Tff7b72= Tff7b72selfTff7b72.Td2a8ff_httpdTff7b72.Td2a8ffserver_address
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3addrTb4b4b4, Tffa657tupleTb4b4b4) Tff7b72and Tffa657lenTb4b4b4(Te6edf3addrTb4b4b4) Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_http_listen_host Tff7b72= Tffa657strTb4b4b4(Te6edf3addrTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_http_listen_port Tff7b72= Tffa657intTb4b4b4(Te6edf3addrTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstop_http_serverTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaddress_errorTa5d6ff"Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_http_last_host Tff7b72= Te6edf3bind_host
Tff7b72selfTff7b72.Td2a8ff_http_last_port Tff7b72= Tff7b72selfTff7b72.Td2a8ff_http_listen_port
Tff7b72selfTff7b72.Td2a8ff_http_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(
Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff_httpdTff7b72.Td2a8ffserve_foreverTb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffmeshchat-repository-httpTa5d6ff"Tb4b4b4,
Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_http_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3url Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffhttp://Tffd700{Tff7b72selfTff7b72.Td2a8ff_http_listen_hostTffd700}Ta5d6ff:Tffd700{Tff7b72selfTff7b72.Td2a8ff_http_listen_portTffd700}Ta5d6ff/Ta5d6ff"
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffhostTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_listen_hostTb4b4b4,
Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff_http_listen_portTb4b4b4,
Ta5d6ff"Ta5d6ffurlTa5d6ff"Tb4b4b4: Te6edf3urlTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffstop_http_serverTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_http_lockTb4b4b4:
Te6edf3httpd Tff7b72= Tff7b72selfTff7b72.Td2a8ff_httpd
Te6edf3thread Tff7b72= Tff7b72selfTff7b72.Td2a8ff_http_thread
Tff7b72selfTff7b72.Td2a8ff_httpd Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_thread Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_listen_host Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_http_listen_port Tff7b72= Tff7b72None
Tff7b72if Te6edf3httpd Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3httpdTff7b72.Td2a8ffshutdownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3loggingTff7b72.Td2a8ffexceptionTb4b4b4(Ta5d6ff"Ta5d6ffrepository HTTP shutdownTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3httpdTff7b72.Td2a8ffserver_closeTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3loggingTff7b72.Td2a8ffexceptionTb4b4b4(Ta5d6ff"Ta5d6ffrepository HTTP server_closeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3thread Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3threadTff7b72.Td2a8ffis_aliveTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3threadTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff8.0Tb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Tff7b72def Td2a8ffrestart_http_serverTb4b4b4(
Tff7b72selfTb4b4b4, Te6edf3hostTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3portTb4b4b4: Tffa657int Tff7b72| Tff7b72None Tff7b72= Tff7b72None
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstop_http_serverTb4b4b4(Tb4b4b4)
Te6edf3use_host Tff7b72= Te6edf3host Tff7b72if Te6edf3host Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72selfTff7b72.Td2a8ff_http_last_host
Te6edf3use_port Tff7b72= Te6edf3port Tff7b72if Te6edf3port Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72selfTff7b72.Td2a8ff_http_last_port
Tff7b72return Tff7b72selfTff7b72.Td2a8ffstart_http_serverTb4b4b4(Te6edf3use_hostTb4b4b4, Te6edf3use_portTb4b4b4)
Tff7b72def Td2a8fflist_entriesTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4]Tb4b4b4:
Te6edf3rowsTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3subTb4b4b4, Te6edf3source Tff7b72in Tb4b4b4(
Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbundled_dirTb4b4b4, Ta5d6ff"Ta5d6ffbundledTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffuploads_dirTb4b4b4, Ta5d6ff"Ta5d6ffuploadTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3subTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72for Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3subTb4b4b4)Tb4b4b4, Te6edf3keyTff7b72=Tffa657strTff7b72.Td2a8fflowerTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3subTb4b4b4, Te6edf3nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3size Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffgetsizeTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72continue
Te6edf3rowsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffbytesTa5d6ff"Tb4b4b4: Te6edf3sizeTb4b4b4, Ta5d6ff"Ta5d6ffsourceTa5d6ff"Tb4b4b4: Te6edf3sourceTb4b4b4}Tb4b4b4)
Tff7b72return Te6edf3rows
Tff7b72def Td2a8ffsave_uploadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3filenameTb4b4b4: Tffa657strTb4b4b4, Te6edf3dataTb4b4b4: Tffa657bytesTb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657boolTb4b4b4, Tffa657str Tff7b72| Tff7b72NoneTb4b4b4]Tb4b4b4:
Te6edf3safe Tff7b72= Te6edf3_safe_any_upload_filenameTb4b4b4(Te6edf3filenameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3safeTb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffinvalid_filenameTa5d6ff"
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff256 Tff7b72* T79c0ff1024 Tff7b72* T79c0ff1024Tb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6fffile_too_largeTa5d6ff"
Te6edf3dest Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuploads_dirTb4b4b4, Te6edf3safeTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3destTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3eTb4b4b4:
Te6edf3loggingTff7b72.Td2a8ffexceptionTb4b4b4(Ta5d6ff"Ta5d6ffrepository upload failed: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3eTb4b4b4)
Tff7b72return Tff7b72FalseTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return Tff7b72TrueTb4b4b4, Tff7b72None
Tff7b72def Td2a8ffdelete_uploadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3filenameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657boolTb4b4b4, Tffa657str Tff7b72| Tff7b72NoneTb4b4b4]Tb4b4b4:
Te6edf3safe Tff7b72= Te6edf3_safe_any_upload_filenameTb4b4b4(Te6edf3filenameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3safeTb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffinvalid_filenameTa5d6ff"
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuploads_dirTb4b4b4, Te6edf3safeTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffnot_foundTa5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72except Tf85149OSError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72return Tff7b72FalseTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return Tff7b72TrueTb4b4b4, Tff7b72None
Tff7b72def Td2a8ff_set_refresh_progressTb4b4b4(
Tff7b72selfTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3runningTb4b4b4: Tffa657boolTb4b4b4,
Te6edf3currentTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Te6edf3completedTb4b4b4: Tffa657intTb4b4b4,
Te6edf3totalTb4b4b4: Tffa657intTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Te6edf3t Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3totalTb4b4b4)
Te6edf3c Tff7b72= Tffa657minTb4b4b4(Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3completedTb4b4b4)Tb4b4b4, Te6edf3tTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_refresh_progress Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Te6edf3runningTb4b4b4,
Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4: Te6edf3currentTb4b4b4,
Ta5d6ff"Ta5d6ffcompletedTa5d6ff"Tb4b4b4: Te6edf3cTb4b4b4,
Ta5d6ff"Ta5d6fftotalTa5d6ff"Tb4b4b4: Te6edf3tTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffrefresh_bundled_wheelsTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Download wheels into ``bundled_dir`` (PyPI JSON + ``urllib``)."""
Tff7b72selfTff7b72.Td2a8ff_last_refresh_error Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_last_refresh_ok Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_last_refresh_failed Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3dest Tff7b72= Te6edf3PathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbundled_dirTb4b4b4)
Te6edf3destTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72for Te6edf3old Tff7b72in Te6edf3destTff7b72.Td2a8ffglobTb4b4b4(Ta5d6ff"Ta5d6ff*.whlTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3oldTff7b72.Td2a8ffunlinkTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4:
Tff7b72pass
Te6edf3total Tff7b72= Tffa657lenTb4b4b4(Te6edf3bundled_pip_targetsTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3okTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3failedTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_set_refresh_progressTb4b4b4(Te6edf3runningTff7b72=Tff7b72TrueTb4b4b4, Te6edf3currentTff7b72=Tff7b72NoneTb4b4b4, Te6edf3completedTff7b72=T79c0ff0Tb4b4b4, Te6edf3totalTff7b72=Te6edf3totalTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72def Td2a8ff_on_pkgTb4b4b4(Te6edf3iTb4b4b4: Tffa657intTb4b4b4, Te6edf3tTb4b4b4: Tffa657intTb4b4b4, Te6edf3pkgTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_set_refresh_progressTb4b4b4(
Te6edf3runningTff7b72=Tff7b72TrueTb4b4b4, Te6edf3currentTff7b72=Te6edf3pkgTb4b4b4, Te6edf3completedTff7b72=Te6edf3iTb4b4b4, Te6edf3totalTff7b72=Te6edf3t
Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3download_bundled_wheels_to_directoryTb4b4b4(Te6edf3destTb4b4b4, Te6edf3on_packageTff7b72=Te6edf3_on_pkgTb4b4b4)
Te6edf3ok Tff7b72= Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffdownloadedTa5d6ff"Tb4b4b4]
Te6edf3failed Tff7b72= Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4]
Tff7b72finallyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_set_refresh_progressTb4b4b4(
Te6edf3runningTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3currentTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3completedTff7b72=Te6edf3totalTb4b4b4,
Te6edf3totalTff7b72=Te6edf3totalTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_last_refresh_ok Tff7b72= Te6edf3ok
Tff7b72selfTff7b72.Td2a8ff_last_refresh_failed Tff7b72= Te6edf3failed
Tff7b72if Tff7b72not Te6edf3ok Tff7b72and Te6edf3failedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_refresh_error Tff7b72= Ta5d6ff"Ta5d6ffall_downloads_failedTa5d6ff"
Tff7b72elif Te6edf3failedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_last_refresh_error Tff7b72= Ta5d6ff"Ta5d6ffpartial_failureTa5d6ff"
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3okTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdownloadedTa5d6ff"Tb4b4b4: Te6edf3okTb4b4b4,
Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4: Te6edf3failedTb4b4b4,
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────